#ifndef _LINK_H_
#define _LINK_H_

#include "polsys_mcu.h"
#include "board.h"

typedef enum _link_ev
{
    LINK_EV_NULL,
    LINK_EV_RECEIVED_PKG,   // 收到一包数据(包括识别包，不代表识别通过)
    LINK_EV_RECEIVED_PKG_TO,    // 收到一包数据，但是这包数据是没有长度信息的（仅防伪码，没有后续数据的量产机）
    LINK_EV_SLOW_PORT,      // 正在通过慢速接口接收数据，需要更长的时间（1秒左右)才能接收完毕
    LINK_EV_TIMEOUT         // 数据收到一半接收超时
}link_ev_t;

typedef enum _link_port
{
    LINK_PORT_UNKNOW,
    LINK_PORT_DP,
    LINK_PORT_VBUS
}link_port_t;

// 需要的API

#define _TW_PortInit()

// 开始插头检测（拔出/插入）
#define _TW_StartPlugCheck()            Board_StartPlugCheck()

// 是否插入产品
#define _TW_IsPlugIn()                  Board_IsPlugIn()

// 从DP发送数据
#define _TW_SendDataDp(buff, len)       Board_SendDataDp(buff, len)

// 让VBUS输出高电平
// VBUS发送识别包之前必须先输出高电平40ms以确保从机被唤醒
#define _TW_SetVBusHigh()               Board_SetVBusHigh()

// 让VBUS输出低电平
// VBUS在接收完数据后需要输出低电平，然后才能发送下一包数据。
#define _TW_SetVBusLow()                Board_SetVBusLow()

// 从VBus发送数据（必要时可关闭插头检测，在 _TW_StartPlugCheck 时再开启）
#define _TW_SendDataVBus(buff, len)     Board_SendDataVBus(buff, len)

// 开始测量发热时电阻和电池电压
#define _TW_StartMeasuring()            Board_StartMeasuring()


// 提供的API

// 外部调用事件：收到了新的数据（1个字节）
void Link_EvReceivedByte(u8 dat, link_port_t port);

void Link_Init();

// [异步]发送识别包,包括头在内的所有数据，收到回应会有事件通知
bool Link_SendIdentify(u8 * buff, u8 len);

// [异步]发送常规数据包，需要提供包括头在内的所有数据，收到回应会有事件通知
bool Link_Send(u8 * buff, u8 len);

// 获取最后一次收到的数据包的所有数据(不包括头0X55AA)。
u8* Link_GetPkg();

// 获取现在链接的产品使用哪个接口通信的
// 成功收到过一包数据后才能准确获取。
link_port_t Link_GetLastRecPort();

// 设置插头接入状态
// true - 插入了设备
// fasle - 拔出了设备
void Link_SetPlugStatus(bool nst);

#endif
